package main
import (
	"fmt"

)
func calcSquares(number int, squareop chan int) {
	sum := 0
	for number != 0 {
		digit := number % 10
		sum += digit * digit
		number /= 10
	}
	squareop <- sum
}
func calcCubes(number int, cubeop chan int) {
	sum := 0
	for number != 0 {
		digit := number % 10
		sum += digit * digit * digit
		number /= 10
	}
	cubeop <- sum
}

// 22. 信道的另一个示例 该程序会计算一个数中每一位的平方和与立方和，然后把平方和与立方和相加并打印出来。
func main(){
	number := 589
	sqrch := make(chan int)
	cubech  := make(chan int)
	go calcSquares(number, sqrch)
	go calcCubes(number, cubech)
	squares, cubes := <-sqrch, <-cubech
	fmt.Println("最终值为：", squares + cubes)

	// 死锁 错误
	// ch := make(chan int)
	// ch <- 5

	// 单向信道 信道都是双向信道，即通过信道既能发送数据，又能接收数据。其实也可以创建单向信道，这种信道只能发送或者接收数据。
	sendch := make(chan<- int)
	go sendData(sendch)
	// fmt.Println(<-sendch) //报错
	cha1 := make(chan int)
	go sendData(cha1)
	fmt.Println("<-cha1= ", <-cha1)//10

	// 关闭信道和使用 for range 遍历信道
	ch := make(chan int)
	go producer(ch)
	// for {
	// 	v, ok := <-ch
	// 	if ok == false {
	// 		break
	// 	}
	// 	fmt.Println("关闭信道:", v, ok)
	// }
	// for range 循环用于在一个信道关闭之前，从信道接收数据。
	for v := range ch {
		fmt.Println("关闭信道-range:", v)

	}

}

// 单向信道
func sendData(sendch chan<- int){
	sendch <- 10
}
// 关闭信道和使用 for range 遍历信道
func producer(chnl chan int) {
	for i := 0; i < 10; i++ {
		chnl <- i
	}
	close(chnl)
}